package ao.com.bna.controle;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

import ao.com.bna.beans.StatusSuplemento;
import ao.com.bna.dao.StatusSuplementoDao;
import ao.com.bna.util.BeanFactory;
import ao.com.bna.util.JsfUtil;


@ManagedBean
@SessionScoped
public class StatusSuplementoControle {
	private StatusSuplemento infoBean = new StatusSuplemento();
	private List<StatusSuplemento> listaStatus = new ArrayList<StatusSuplemento>();
	private StatusSuplementoDao dao = (StatusSuplementoDao) BeanFactory.getBean("statusSuplementoDao",
			StatusSuplementoDao.class);
	private String estadoCorrente;
	private String paginaDestino;
	private String tituloPagina;

	public StatusSuplementoControle() {
		actualizaTela();
	}

	/**
	 * @return the infoBean
	 */
	public StatusSuplemento getInfoBean() {
		return infoBean;
	}

	/**
	 * @param infoBean
	 *            the infoBean to set
	 */
	public void setInfoBean(StatusSuplemento infoBean) {
		this.infoBean = infoBean;
	}

	/**
	 * @return the listaInfos
	 */
	public ListDataModel<StatusSuplemento> getListaInfos() {
		return new ListDataModel<StatusSuplemento>(listaStatus);
	}
	
	
	

	/**
	 * @return the listaStatus
	 */
	public List<StatusSuplemento> getListaStatus() {
		return listaStatus;
	}

	/**
	 * @param listaStatus the listaStatus to set
	 */
	public void setListaStatus(List<StatusSuplemento> listaStatus) {
		this.listaStatus = listaStatus;
	}

	/**
	 * @return the dao
	 */
	public StatusSuplementoDao getDao() {
		return dao;
	}

	/**
	 * @param dao
	 *            the dao to set
	 */
	public void setDao(StatusSuplementoDao dao) {
		this.dao = dao;
	}

	private void actualizaTela() {
		infoBean = new StatusSuplemento();
		listaStatus = dao.listar();
		tituloPagina = ResourceBundle.getBundle("resources.mensagens")
				.getString("statusSuplementoTituloListar");
	}

	/**
	 * @see Metodo que ivoca o metodo gravar apartir da classe EstadoDao
	 */
	public String gravar() {
		try {
			this.dao.gravar(getInfoBean());
			if (this.isEstadoAdicionar()) {
				JsfUtil.addSuccessMessage(ResourceBundle.getBundle(
						"resources.mensagens").getString("geralRegistoCriado"));
				actualizaTela();
				return this.preparaAdicionar();
			} else if (this.isEstadoActualizar()) {
				JsfUtil.addSuccessMessage(ResourceBundle.getBundle(
						"resources.mensagens")
						.getString("geralRegistoAlterado"));
				///actualizaTela();
				this.setEstadoCorrente(JsfUtil.ESTADO_FORMVAZIO);
				return null; // this.voltar();
			}
			return null;
		} catch (Exception e) {
			JsfUtil.addErrorMessage(
					e,
					ResourceBundle.getBundle("resources.mensagens").getString(
							"geralErroDePersistencia"));
			return null;
		}
	}

	/**
	 * @see Metodo que obtem um registo
	 */
	public StatusSuplemento obterPorID() {
		tituloPagina = ResourceBundle.getBundle("resources.mensagens")
				.getString("statusSuplementoTituloListar");
		return dao.obterPorID(getInfoBean().getId());
	}

	/**
	 * @see Metodo que ivoca o metodo remover apartir da classe EstadoDao
	 */
	public String excluir() {
		try {
			this.dao.remover(this.getInfoBean());
			JsfUtil.addSuccessMessage(ResourceBundle.getBundle(
					"resources.mensagens").getString("geralRegistoEliminado"));
			this.setEstadoCorrente(JsfUtil.ESTADO_FORMVAZIO);
			return null; // this.voltar();
		} catch (Exception e) {
			JsfUtil.addErrorMessage(
					e,
					ResourceBundle.getBundle("resources.mensagens").getString(
							"geralErroDePersistencia"));
			return null;
		}
	}

	public SelectItem[] getItemsAvailableSelectOneEmpety() {
		List<StatusSuplemento> lista = new ArrayList<StatusSuplemento>();
		return JsfUtil.getSelectItems(lista, true);
	}

	public SelectItem[] getItemsAvailableSelectMany() {
		return JsfUtil.getSelectItems(this.dao.listar(), false);
	}

	public SelectItem[] getItemsAvailableSelectOne() {
		return JsfUtil.getSelectItems(this.dao.listar(), true);
	}

	@FacesConverter(forClass = StatusSuplemento.class)
	public static class EntityConverter implements Converter {

		public Object getAsObject(FacesContext facesContext,
				UIComponent component, String value) {
			if (value == null || value.length() == 0) {
				return null;
			}
			StatusSuplementoControle controller = (StatusSuplementoControle) facesContext
					.getApplication()
					.getELResolver()
					.getValue(facesContext.getELContext(), null, "statusSuplementoControle");
			return controller.dao.obterPorID(getKey(value));
		}

		java.lang.Long getKey(String value) {
			java.lang.Long key;
			key = Long.valueOf(value);
			return key;
		}

		String getStringKey(java.lang.Long value) {
			StringBuffer sb = new StringBuffer();
			sb.append(value);
			return sb.toString();
		}

		public String getAsString(FacesContext facesContext,
				UIComponent component, Object object) {
			if (object == null) {
				return null;
			}
			if (object instanceof StatusSuplemento) {
				StatusSuplemento o = (StatusSuplemento) object;
				return getStringKey(o.getId());
			} else {
				throw new IllegalArgumentException("object " + object
						+ " is of type " + object.getClass().getName()
						+ "; expected type: " + StatusSuplemento.class.getName());
			}
		}

	}

	/*
	 * MÈtodos que expıem o estado da pagina
	 */

	/**
	 * Prepara view detalhe
	 */
	public String preparaDetalhes() {
		this.setEstadoCorrente(JsfUtil.ESTADO_DETALHES);
		this.tituloPagina = ResourceBundle.getBundle("resources.mensagens")
				.getString("statusSuplementoTituloDetalhes");
		return null;
	}

	public String novo() {
		this.infoBean = new StatusSuplemento();
		return ResourceBundle.getBundle("resources.mensagens").getString(
				"statusSuplementoPaginaCRUD");
	}

	/**
	 * Prepara view adicionar
	 */
	public String preparaAdicionar() {
		this.setEstadoCorrente(JsfUtil.ESTADO_ADICIONAR);
		this.tituloPagina = ResourceBundle.getBundle("resources.mensagens")
				.getString("statusSuplementoTituloRegistar");
		return novo();
	}

	/**
	 * Prepara view editar
	 */
	public String preparaEditar() {
		this.setEstadoCorrente(JsfUtil.ESTADO_ACTUALIZAR);
		this.tituloPagina = ResourceBundle.getBundle("resources.mensagens")
				.getString("statusSuplementoTituloAlterar");
		return ResourceBundle.getBundle("resources.mensagens").getString(
				"statusSuplementoPaginaCRUD");
	}

	/**
	 * Prepara view eliminar
	 */
	public String preparaEliminar() {
		this.setEstadoCorrente(JsfUtil.ESTADO_ELIMINAR);
		this.tituloPagina = ResourceBundle.getBundle("resources.mensagens")
				.getString("statusSuplementoTituloEliminar");
		return ResourceBundle.getBundle("resources.mensagens").getString(
				"statusSuplementoPaginaCRUD");
	}

	/**
	 * Referente ao botao voltar
	 */
	public String voltar() {
		this.actualizaTela();
		return ResourceBundle.getBundle("resources.mensagens").getString(
				"statusSuplementoPaginaListar");
	}

	// //////////////////////////////////
	public boolean isEstadoPesquisar() {
		String state = this.getEstadoCorrente();
		return (state == null || JsfUtil.ESTADO_PESQUISAR.equals(state));
	}

	public boolean isEstadoAdicionar() {
		return JsfUtil.ESTADO_ADICIONAR.equals(this.getEstadoCorrente());
	}

	public boolean isEstadoActualizar() {
		return JsfUtil.ESTADO_ACTUALIZAR.equals(this.getEstadoCorrente());
	}

	public boolean isEstadoEliminar() {
		return JsfUtil.ESTADO_ELIMINAR.equals(this.getEstadoCorrente());
	}

	public boolean isEstadoDetalhe() {
		return JsfUtil.ESTADO_DETALHES.equals(this.getEstadoCorrente());
	}

	public boolean isEstadoFormVazio() {
		return JsfUtil.ESTADO_FORMVAZIO.equals(this.getEstadoCorrente());
	}

	public boolean isEstadoCrud() {
		return (this.isEstadoAdicionar() || this.isEstadoActualizar()
				|| this.isEstadoEliminar() || this.isEstadoDetalhe() || this.isEstadoFormVazio());
	}

	/**
	 * @return the estadoCorrente
	 */
	public String getEstadoCorrente() {
		return estadoCorrente;
	}

	/**
	 * @param estadoCorrente
	 *            the estadoCorrente to set
	 */
	public void setEstadoCorrente(String estadoCorrente) {
		this.estadoCorrente = estadoCorrente;
	}

	/**
	 * @return the paginaDestino
	 */
	public String getPaginaDestino() {
		return paginaDestino;
	}

	/**
	 * @param paginaDestino
	 *            the paginaDestino to set
	 */
	public void setPaginaDestino(String paginaDestino) {
		this.paginaDestino = paginaDestino;
	}

	/**
	 * @return the tituloPagina
	 */
	public String getTituloPagina() {
		return tituloPagina;
	}

	/**
	 * @param tituloPagina
	 *            the tituloPagina to set
	 */
	public void setTituloPagina(String tituloPagina) {
		this.tituloPagina = tituloPagina;
	}

}
